package com.atguigu.tingshu.search.service;

import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import com.atguigu.tingshu.model.search.AlbumInfoIndex;
import com.atguigu.tingshu.model.search.SuggestIndex;
import com.atguigu.tingshu.query.search.AlbumIndexQuery;
import com.atguigu.tingshu.vo.search.AlbumSearchResponseVo;

import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface SearchService {


    /**
     * 将指定专辑封装专辑索引库文档对象，完成稳定新增
     * @param albumId
     */
    void upperAlbum(Long albumId);

    /**
     * 下架专辑-删除文档
     * @param albumId
     */
    void lowerAlbum(Long albumId);

    /**
     * 专辑检索 ，支持关键字、分类、标签条件分页检索，结果高亮
     * @param albumIndexQuery 查询条件对象：包含关键字、分类id、标签列表、排序、分页信息
     * @return
     */
    AlbumSearchResponseVo search(AlbumIndexQuery albumIndexQuery);

    /**
     * 基于入参查询条件构建完整检索请求对象
     * @param albumIndexQuery
     * @return
     */
    SearchRequest buildDSL(AlbumIndexQuery albumIndexQuery);

    /**
     * 解析ES响应结果，将ES响应JSON转为AlbumSearchResponseVo对象
     * @param searchResponse ES响应结果
     * @return
     */
    AlbumSearchResponseVo parseResult(SearchResponse<AlbumInfoIndex> searchResponse,AlbumIndexQuery albumIndexQuery);

    /**
     * 查询指定一级分类下热门排行专辑(top6)
     * @param category1Id
     * @return
     */
    List<Map<String, Object>> getTopCategoryAlbumList(Long category1Id);

    /**
     * 根据用户正在录入文本进行自动联想
     * @param keyword
     * @return
     */
    List<String> completeSuggest(String keyword);

    /**
     * 解析自定义建议词结果
     * @param suggestName 自定义建议词参数名称
     * @param searchResponse ES响应结果
     * @return
     */
    Collection<String> parseSuggestResult(String suggestName, SearchResponse<SuggestIndex> searchResponse);

    /**
     * 更新Redis所有1级分类不同排序Top10专辑
     */
    void updateLatelyAlbumRanking();

    /**
     * 获取指定1级分类下不同排序方式榜单列表-从Redis中获取
     * @param category1Id
     * @param dimension
     * @return
     */
    List<AlbumInfoIndex> getRankingList(Long category1Id, String dimension);
}
